最近在做一个游戏助手类App,前期数据量较小,朋友帮忙抓取了一下装备数据存在CSV文件中,这里简单介绍一下SwiftCSV的安装使用及简单封装
安装
我们这里使用Cocoapods安装
target 'Tk300HeroAssistant' do
pod 'SwiftCSV'
读入CSV文件
首先我们要读入CSV文件,创建一个CSV对象
首先我们从字符串字面量来创建一个CSV对象
let csv = CSV(string: "id,name,age\n1,Alice,18")
如果需要自定义分隔符可以这样
let tsv = CSV(string: "id\tname\tage\n1\tAlice\t18", delimiter: "\t")
我们可以传入路径及文件名来读取,可能会出错,所以使用try catch来捕获异常
// From a file (with errors)
do {
let csv = try CSV(name: "users.csv")
} catch {
// Catch errors or something
}
自定义换行符和编码方式
do {
let tsv = try CSV(name: "users.tsv", delimiter: tab, encoding: NSUTF8StringEncoding)
} catch {
// Error handling
}
数据读取
根据CSV的内容,写出如下的Model类
实际应用不要用中文
实际应用不要用中文
实际应用不要用中文
import Foundation
class SkillData:NSObject {
var id:String?
var name:String?
var 快捷键:String?
var 冷却时间:String?
var 技能消耗:String?
var Information:String?
}
数据读取是一个需要时间的过程,所以我们用GCD来在异步线程进行读取,通过一个回调函数来获取我们的数据,并且封装一个通用的读取方法
import Foundation
import SwiftCSV
class CSVReader {
/**
CSV读取
- parameter fileName: 文件名
- parameter completionHandle: completionHandle
*/
class func loadDataFromCSV<T:NSObject>(fileName:String,completionHandle:([T])->Void){
//异步读取
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
let filePath = NSBundle.mainBundle().pathForResource(fileName, ofType: "csv")
let csvURL = NSURL(fileURLWithPath: filePath!)
do{
let csv = try CSV(url: csvURL)
let dataArray = csv.rows.map({ (dic:[String:String]) -> T in
let data = T()
dic.forEach({ (key,value) in
data.setValue(value, forKey: key)
})
return data
})
dispatch_async(dispatch_get_main_queue(), {
completionHandle(dataArray)
})
}catch{
completionHandle([])
}
})
}
}
随后我们在一个Manager类中创建业务相关的读取方法
import Foundation
class CSVDataManager{
static let sharedInstance = CSVDataManager()
var skillDataArray:[SkillData]?
func loadSkillData(completionHandle:([SkillData])->Void) {
if let data = skillDataArray{
completionHandle(data)
}else{
CSVReader.loadDataFromCSV("skill data", completionHandle: { (data:[SkillData]) in
self.skillDataArray = data
completionHandle(data)
})
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。